<html>
  <head>
    <meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>2017.11找实习-面经-Java | Elvis Zhang</title>
<meta name="description" content="The easy way or the right way." />
<link rel="shortcut icon" href="https://blog.shunzi.tech/favicon.ico">
<link rel="stylesheet" href="https://blog.shunzi.tech/styles/main.css">
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/KaTeX/0.10.0/katex.min.css">

<script data-ad-client="ca-pub-7661668224317940" async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script>
<script src="https://blog.shunzi.tech/media/js/jquery.min.js"></script>
<script src="https://blog.shunzi.tech/media/js/masonry.pkgd.min.js"></script>
<script src="https://blog.shunzi.tech/media/js/aos.js"></script>
<script src="https://blog.shunzi.tech/media/js/pace.min.js"></script>
<script src="https://blog.shunzi.tech/media/js/view-image.min.js"></script>
<script src="https://blog.shunzi.tech/media/js/jquery.magnific-popup.min.js"></script>
<script src="https://blog.shunzi.tech/media/js/functions.js"></script>
    <meta name="referrer" content="never">
    <meta name="description" content="

2017年11月，为了2018年上半年的企业实习投递了一系列简历并参与了相关面试。
主要分为Java篇，数据库篇，网络篇，框架篇，算法篇和相关工具篇
当时无太多项目经验，一切都还是入门阶段





面试的岗位主要是Java后端开发实习..." />
    <meta name="keywords" content="面经" />
    <script src="https://blog.shunzi.tech/media/js/waterfall.min.js"></script>
    <script src="https://blog.shunzi.tech/media/js/prism.min.js"></script>
  </head>
  <body>
            <header id="header" class="grid-container">
        <!-- start: .menu-wrapper -->
        <div class="menu-mobile"> 
          <i class="fa fa-reorder"></i>
        </div>
        <div class="menu-wrapper">
          <div class="">
            <div class="logo">
              <a href="https://blog.shunzi.tech"><img src="\media\images\custom-headerLogo.jpg" alt=""></a>
            </div>
            <!-- start: .main-nav -->

            <nav class="main-nav grid-container grid-parent">
              <ul id="menu-header" class="menu gradient-effect">
                <li class=""><a href="https://blog.shunzi.tech" class="menu">首页</a></li>
                
                  <li class="" >
                    <a href="/archives" class="menu">
                      归档
                    </a>
                  </li>
                
                  <li class="" >
                    <a href="/tag/diary" class="menu">
                      随笔
                    </a>
                  </li>
                
                  <li class="" >
                    <a href="/movies" class="menu">
                      观影
                    </a>
                  </li>
                
                  <li class="" >
                    <a href="/post/about" class="menu">
                      关于
                    </a>
                  </li>
                
                <li class="search-menu-item hide-on-mobile hide-on-tablet"><a href="#search-lightbox" class="lightbox mfp-inline"><i class="fa fa-search-line"></i></a></li>
              </ul>
            </nav>
            <a href="#search-lightbox" class="lightbox epcl-search-button mfp-inline hide-on-tablet hide-on-desktop"><i class="fa fa-search-line"></i></a>
            <!-- end: .main-nav -->
            <div class="clear"></div>
            <div class="border hide-on-tablet hide-on-mobile"></div>
          </div>    
          <div class="clear"></div>
        </div>
        <!-- end: .menu-wrapper -->
        <div class="clear"></div>
      </header>
      <div class="hide-on-mobile hide-on-tablet hide-on-desktop">
        <div id="search-lightbox" class="grid-container grid-small grid-parent mfp-hide">
          <div class="search-wrapper section">
            <form id="gridea-search-form" data-update="1620954331293" action="/search/index.html" class="search-form" _lpchecked="1">
              <input type="text" name="q" id="s" value="" class="search-field" placeholder="搜点啥..." aria-label="搜点啥..." required="">
              <button type="submit" class="submit" aria-label="Submit">
                <i class="fa fa-search-line"></i>
              </button>
            </form>
          </div>
        </div>
      </div>

      <main id="single" class="main grid-container fullcover no-sidebar aos-init aos-animate" data-aos="fade">

        <div class="center content">
          <div class="featured-image cover" style="background-image: url('\media\images\custom-featureImage.jpg');">
            <div class="meta top"> 
              <time class="meta-info" style="float:left;" datetime="2017-12-21"><i class="fa fa-calendar"></i><span class="lately">3 年前</span></time>
              
              <a href="https://blog.shunzi.tech/post/apply-intern-java/#comments" class="comments meta-info" title="">
                <i class="fa fa-comment remixicon"></i><span class="comment-count valine-comment-count" data-xid="/apply-intern-java/"> </span>
              </a>
              <span id="/apply-intern-java/" class="leancloud_visitors views-counter meta-info" title=""><i class="fa fa-leancloud remixicon"></i><span class="leancloud-visitors-count"></span></span>
              
            </div>
            <div class="info">
              <div class="tags ">
                
                      <a href="https://blog.shunzi.tech/tag/mian-jing/" class="ctag ctag-0 ctag-mian-jing" aria-label="">面经</a>
                    
              </div>
              <h1 class="title ularge white bold">2017.11找实习-面经-Java</h1>
            </div>
          </div>
        </div>  

        <div class="epcl-page-wrapper">
          <div class="left-content grid-70 np-mobile">
            <article class="main-article post">
              <section class="post-content">
                <div class="text">
                  <blockquote>
<ul>
<li>2017年11月，为了2018年上半年的企业实习投递了一系列简历并参与了相关面试。</li>
<li>主要分为Java篇，数据库篇，网络篇，框架篇，算法篇和相关工具篇</li>
<li>当时无太多项目经验，一切都还是入门阶段</li>
</ul>
</blockquote>
<h2 id="-more-"><!-- more --></h2>
<blockquote>
<ul>
<li>面试的岗位主要是Java后端开发实习生的岗位.</li>
<li>主要面的有今日头条、百度、网易、搜狐、滴滴、SAP</li>
<li>较为简单的有所省略直接给相关问题或者直接上链接</li>
<li>较为常见的或者说比较重要的后续会单独写博文或者贴一些友链进行探讨</li>
<li>因为确实面试相关的博客已经很多很多，我想做的其实更多的是一个汇总</li>
</ul>
<hr>
<ul>
<li>另外，不同岗位的直接看CS公共基础知识部分的即可（OS、计网、计组）</li>
</ul>
<h4 id="此篇为java篇持续更新ing">此篇为Java篇，持续更新ing</h4>
</blockquote>
<h2 id="1-java基本知识">1、Java基本知识</h2>
<h3 id="实现多线程的方式">实现多线程的方式</h3>
<blockquote>
<p><strong>之后会统一的进行并发编程的相关知识点的整理和总结</strong></p>
</blockquote>
<ul>
<li>常见方式一：继承 Thread 类；对应的重写run()方法，start() 方法执行</li>
<li>常见方式二：实现 Runable 接口；对应的重写run()方法，start() 方法执行</li>
<li>方式三：实现Callable接口通过FutureTask包装器来创建Thread线程</li>
<li>方式四：使用ExecutorService、Callable、Future实现有返回结果的线程</li>
<li><a href="https://www.cnblogs.com/wxd0108/p/5479442.html">参考博文：Java中的多线程你只要看这一篇就够了</a></li>
<li><a href="https://www.cnblogs.com/felixzh/p/6036074.html">参考博文：JAVA多线程实现的四种方式</a></li>
</ul>
<h3 id="list-map-set的区别和应用场景集合框架">list、map、set的区别和应用场景（集合框架）</h3>
<h6 id="1存放">1.存放</h6>
<ul>
<li>(1)List存放元素是有序，可重复，继承Collection</li>
<li>(2)Set存放元素无序，不可重复，继承Collection</li>
</ul>
<pre><code class="language-java">public interface Collection&lt;E&gt; extends Iterable&lt;E&gt; {
    int size();
    boolean isEmpty();
    boolean contains()
    boolean add(E e);
    boolean remove(Object o);
    boolean containsAll(Collection&lt;?&gt; c);
    boolean addAll(Collection&lt;? extends E&gt; c);
    boolean removeAll(Collection&lt;?&gt; c);
    // 取交集
    boolean retainAll(Collection&lt;?&gt; c);
    
    Object[] toArray();
    &lt;T&gt; T[] toArray(T[] a);
    
    Iterator&lt;E&gt; iterator();

    // ...
}
</code></pre>
<ul>
<li>(3)Map元素键值对形式存放，键无序不可重复，值可重复</li>
</ul>
<pre><code class="language-java">public interface Map&lt;K,V&gt; {
    int size();
    boolean isEmpty();
    boolean containsKey(Object key);
    boolean containsValue(Object value);
    V get(Object key);
    V put(K key, V value);
    V remove(Object key);
    void putAll(Map&lt;? extends K, ? extends V&gt; m);
    void clear();
    Set&lt;K&gt; keySet();
    Collection&lt;V&gt; values();
    Set&lt;Map.Entry&lt;K, V&gt;&gt; entrySet();
    //...
}
</code></pre>
<h6 id="2取出">2.取出</h6>
<blockquote>
<p><strong>Java8</strong> 可使用 <strong>lamda表达式</strong> 以及  <strong>函数式编程</strong> 实现访问集合中元素，此处暂不涉及，后续会统一对 <strong>Java8</strong> 的相关特性进行讲解。</p>
</blockquote>
<ul>
<li>(1)List取出元素for循环，foreach循环，Iterator迭代器迭代</li>
</ul>
<pre><code class="language-java">// 使用 for 循环
public void printAllUsingFor(List&lt;E&gt; list) {
	// 注意将size() 的调用尽可能减少调用次数并使用临时空间变量节省空间
	for (int i = 0, size = list.size(); i &lt; size; i++) {
		System.out.print(list.get(i));
	}
	System.out.println();
}

// 使用 foreach （其本质仍为迭代器，Java编译器在生成字节码时对应的修改为迭代器）
public void printAllUsingForEach(List&lt;E&gt; list) {
	for (E e : list) {
		System.out.print(e);
	}
	System.out.println();
}

// 使用 迭代器
public void printAllUsingIterator(List&lt;E&gt; list) {
	for (Iterator iterator = list.iterator(); iterator.hasNext(); ) {
		E e = (E) iterator.next();
		System.out.print(e);
	}
	System.out.println();
}

// 最佳实践（list中存放的元素数目较少时无论采用哪种遍历方式，结果都相差不大
// 但当数据量相对较大时，则需要根据list的类型对应的进行遍历方式的调整。
public void printAll(List&lt;E&gt; list) {
	if (list instanceof RandomAccess) {
		printAllUsingFor(list);
	} else {
		printAllUsingIterator(list);
	}
}
</code></pre>
<ul>
<li>(2)Set取出元素foreach循环，Iterator迭代器迭代</li>
</ul>
<pre><code class="language-java">// 迭代器 与 List的迭代器访问同理，此处不再演示
// 同时 迭代器 与 foreach 效率相差无几，不再具体进行相关对比
public void printAllUsingForEach(Set&lt;E&gt; set) {
	for (E e : set) {
		System.out.print(e);
	}
	System.out.println();
}
</code></pre>
<ul>
<li>(3)Map取出元素需转换为Set，然后进行Iterator迭代器迭代，或转换为Entry对象进行Iterator迭代器迭代</li>
</ul>
<pre><code class="language-java">// 遍历 key 和 value，对应的也可以根据key去获取value
public void printKeySetAndValueSet(Map&lt;E, Object&gt; map) {
	for (E e : map.keySet()) {
		System.out.println(&quot;keys = &quot; + e);
	}

	for (Object value : map.values()) {
		System.out.println(&quot;values = &quot; + value);
	}
}

// foreach
public void printAllUsingForEach(Map&lt;E, Object&gt; map) {
	for (Map.Entry&lt;E, Object&gt; entry : map.entrySet()) {
		System.out.println(&quot;key = &quot; + entry.getKey() + &quot;;value = &quot; + entry.getValue());
	}
}

// iterator 两种方式（是否使用泛型）
public void printAllUsingIterator(Map&lt;E, Object&gt; map) {
	for (Iterator iterator = map.entrySet().iterator(); iterator.hasNext(); ) {
		// 需要强转，遍历器返回的类型为 Object
		Map.Entry&lt;E, Object&gt; entry = (Map.Entry) iterator.next();
		System.out.println(&quot;key = &quot; + entry.getKey() + &quot;; value = &quot; + entry.getValue());
	}
	
	for (Iterator&lt;Map.Entry&lt;E, Object&gt;&gt; iterator = map.entrySet().iterator(); iterator
				.hasNext(); ) {
		// 不需要强转，由于返回类型同 获得的遍历器 泛型一致
		Map.Entry&lt;E, Object&gt; entry = iterator.next();
		System.out.println(&quot;key = &quot; + entry.getKey() + &quot;; value = &quot; + entry.getValue());
	}
}


</code></pre>
<blockquote>
<p><a href="http://blog.csdn.net/u012442401/article/details/47850501">相关博文：Java迭代器的使用以及和for的区别</a></p>
</blockquote>
<h4 id="list中的相关集合框架arraylist-linkedlist-stack-vector">List中的相关集合框架（ArrayList、LinkedList、Stack、Vector）</h4>
<h5 id="linkedlist和arraylist的区别">linkedList和arrayList的区别</h5>
<blockquote>
<p>区别最主要是 <strong>顺序存储</strong> 和 <strong>链式存储</strong> 的区别</p>
</blockquote>
<ul>
<li>
<p>1．对ArrayList和LinkedList而言，在列表末尾增加一个元素所花的开销都是固定的。对ArrayList而言，主要是在内部数组中增加一项，指向所添加的元素，偶尔可能会导致对数组重新进行分配；而对LinkedList而言，这个开销是统一的，分配一个内部Entry对象。</p>
</li>
<li>
<p>2．在ArrayList的中间插入或删除一个元素意味着这个列表中剩余的元素都会被移动；而在LinkedList的中间插入或删除一个元素的开销是固定的。</p>
</li>
<li>
<p>3．LinkedList不支持高效的随机元素访问。</p>
</li>
<li>
<p>4．ArrayList的空间浪费主要体现在在list列表的结尾预留一定的容量空间，而LinkedList的空间花费则体现在它的每一个元素都需要消耗相当的空间</p>
</li>
</ul>
<blockquote>
<p>可以这样说：当操作是在一列数据的后面添加数据而不是在前面或中间,并且需要随机地访问其中的元素时,使用ArrayList会提供比较好的性能；当你的操作是在一列数据的前面或中间添加或删除数据,并且按照顺序访问其中的元素时,就应该使用LinkedList了。</p>
</blockquote>
<h5 id="arraylist-stack和vector的主要区别">ArrayList、Stack和Vector的主要区别</h5>
<ul>
<li>1、Vector、Stack：线程安全；ArrayList、LinkedList：非线程安全。<strong>对于相关线程安全实现的机制将在并发编程中进行统一的讲解！</strong></li>
<li>2、实现方式： LinkedList：双向链表，ArrayList，Vector，Stack：数组；</li>
<li>3、Stack继承自Vector，只在Vector的基础上添加了几个Stack相关的方法</li>
</ul>
<pre><code class="language-java">public class Stack&lt;E&gt; extends Vector&lt;E&gt; {
    public E push(E item) {
        // public synchronized void addElement(E obj)
        addElement(item);
        return item;
    }
    
    public synchronized E pop() {...}
    public synchronized E peek() {...}
    
    public boolean empty() {
        return size() == 0;
    }
    
    public synchronized int search(Object o) {
        int i = lastIndexOf(o);
        if (i &gt;= 0) {
            return size() - i;
        }
        return -1;
    }
    
    ...
}
</code></pre>
<ul>
<li>4、ArrayList和Vector在动态扩容时有所不同。</li>
</ul>
<pre><code class="language-java">// ArrayList
int newCapacity = (oldCapacity * 3)/2 + 1;  

// Vector
int newCapacity = (capacityIncrement &gt; 0) ?  
            (oldCapacity + capacityIncrement) : (oldCapacity * 2);  

</code></pre>
<h4 id="set相关的集合框架hashset-treeset">Set相关的集合框架（HashSet、TreeSet）</h4>
<h6 id="hashset-和-treeset">HashSet 和 TreeSet</h6>
<ul>
<li>1.HashSet 是无序的，不能保证元素排列顺序，底层是由 HashMap 进行实现的。<strong>（讲HashMap时会进行具体阐述）</strong>，会根据对应的hashCode进行相关排序；TreeSet 是有序的，底层是通过 TreeMap 实现 <strong>（对应的会单独讲实现原理---红黑树 Entry）</strong> 的。TreeSet 通过使用 compareTo() 方法来比较然后升序排列，也可以定制排序逻辑。</li>
</ul>
<pre><code class="language-java">TreeSet treeSet = new TreeSet();
HashSet hashSet = new HashSet();
hashSet.add(1);
hashSet.add(0);
hashSet.add(3);
hashSet.add(2);
hashSet.add(-1);
System.out.println(hashSet);// &gt;&gt; [0, -1, 1, 2, 3]

treeSet.add(1);
treeSet.add(0);
treeSet.add(3);
treeSet.add(2);
treeSet.add(-1);
System.out.println(treeSet);// &gt;&gt; [-1, 0, 1, 2, 3]
</code></pre>
<ul>
<li>2、HashSet 允许存放 null，但只能存放一个 null <strong>（由于Hash表的原因）</strong>，而 TreeSet 不能，会抛出对应的空指针异常。</li>
</ul>
<pre><code class="language-java">hashSet.add(1);
hashSet.add(null);
hashSet.add(null);
System.out.println(hashSet); // &gt;&gt; [null,1]
</code></pre>
<h6 id="hashmap的原理">hashMap的原理</h6>
<ul>
<li>会新开博文具体阐释三者原理和区别</li>
<li><a href="http://blog.csdn.net/vking_wang/article/details/14166593">参考友链：HashMap实现原理分析</a></li>
</ul>
<h6 id="hashtable的原理">hashTable的原理</h6>
<ul>
<li>会新开博文结合源码具体阐释三者原理和区别</li>
<li><a href="http://blog.csdn.net/zheng0518/article/details/42199477">参考博文：深入Java集合学习系列：Hashtable的实现原理</a></li>
</ul>
<h6 id="concurrenthashmap的原理">concurrentHashMap的原理</h6>
<ul>
<li>会新开博文具体阐释三者原理和区别</li>
<li><a href="http://www.importnew.com/16142.html">参考友链：ConcurrentHashMap原理分析</a></li>
</ul>
<h4 id="object中常用的方法">Object中常用的方法</h4>
<h5 id="hashcode">hashCode</h5>
<ul>
<li>Object 类会提供 hashCode() 方法的声明并使用 native 关键字标志其由非java语言实现，具体的方法实现在外部。</li>
</ul>
<pre><code class="language-java">public native int hashCode();
</code></pre>
<ul>
<li>String 中的 hashCode()。hash 对应的算法.<br>
<a href="http://blog.csdn.net/tayanxunhua/article/details/20525251">相关博文：关于hashcode 里面 使用31 系数的问题</a></li>
</ul>
<figure data-type="image" tabindex="1"><img src="http://chart.googleapis.com/chart?cht=tx&amp;chl=s%5B0%5D*31%5E%7Bn-1%7D%2Bs%5B1%5D*31%5E%7Bn-2%7D%2B...%2Bs%5Bn-1%5D" alt="image" loading="lazy"></figure>
<ul>
<li>String类是用它的value值作为参数来计算hashCode的，也就是说，相同的value就一定会有相同的hashCode值。但反之不成立，即hashCode相同，value值不一定相同。这种情况又被称为<strong>hash冲撞（冲突）</strong>,hashMap中对应的解决方式就是hashCode相同的对象再构造一个线性表。</li>
</ul>
<pre><code class="language-java">public int hashCode() {
    int h = hash;
    if (h == 0 &amp;&amp; value.length &gt; 0) {
        char val[] = value;
        
        for (int i = 0; i &lt; value.length; i++) {
            h = 31 * h + val[i];
        }
        hash = h;
    }
    return h;
}
</code></pre>
<ul>
<li>当然最好的 <strong>hashCode()</strong> 方法则是所有不同的对象都能有各自的 <strong>Hash码</strong>，同时注意在设计对应的 <strong>hashCode()</strong> 方法时，</li>
</ul>
<blockquote>
<p>无论何时，对同一个对象调用hashCode()都应该产生同样的值。如果在讲一个对象用put()添加进HashMap时产生一个hashCdoe值，而用get()取出时却产生了另一个hashCode值，那么就无法获取该对象了。所以如果你的hashCode方法依赖于对象中易变的数据，用户就要当心了，因为此数据发生变化时，hashCode()方法就会生成一个不同的散列码.---<strong>By Effective Java</strong></p>
</blockquote>
<ul>
<li><a href="http://blog.csdn.net/benjaminzhang666/article/details/9468605">参考博文：重写HashCode的内存变化过程以及两种重写hashCode方式的比较</a></li>
<li><a href="http://blog.csdn.net/sunmenggmail/article/details/18660699">参考博文：通用的Java hashCode重写方案</a></li>
</ul>
<h5 id="equals-和">equals 和 ==</h5>
<p><a href="https://www.cnblogs.com/Eason-S/p/5524837.html">参考博文：equals和==的区别小结</a></p>
<h6 id="">==</h6>
<ul>
<li>== 比较的是变量(栈)内存中存放的对象的(堆)内存地址，用来判断两个对象的地址是否相同，即是否是指相同一个对象。比较的是真正意义上的指针操作。</li>
</ul>
<h6 id="equals">equals()</h6>
<ul>
<li>equals用来比较的是两个对象的内容是否相等，由于所有的类都是继承自java.lang.Object类的，所以适用于所有对象，如果没有对该方法进行覆盖的话，调用的仍然是Object类中的方法，而Object中的equals方法返回的却是==的判断。</li>
<li>默认的 equals() 和 String 中的 equals()</li>
</ul>
<pre><code class="language-java">public boolean equals(Object obj) {
    return (this == obj);
}

public boolean equals(Object anObject) {
    if (this == anObject) {
        return true;
    }
    if (anObject instanceof String) {
        String anotherString = (String)anObject;
        int n = count;
        if (n == anotherString.count) {
            char v1[] = value;
            char v2[] = anotherString.value;
            int i = offset;
            int j = anotherString.offset;
            while (n-- != 0) {
                if (v1[i++] != v2[j++])
                    return false;
            }
            return true;
        }
    }
    return false;
}
</code></pre>
<ul>
<li>对于自定义的对象，当重写 equals() 方法时需要对应的重写 hashCode() 方法
<ul>
<li>1、如果两个对象相同（即用equals比较返回true），那么它们的hashCode值一定要相同；</li>
<li>2、如果两个对象的hashCode相同，它们并不一定相同(即用equals比较返回false)</li>
</ul>
</li>
<li>考虑到 Java 的集合框架中有很多关于 Hash 表的相关实现。hashCode() 的效率相对于复杂的业务逻辑对应的 equals() 方法而言是要高得多的。所以在相关数据结构中采用先 hash 的方式再利用 equals() 进行相关比较能够更好的提高性能，同时保证 hash 表中存放的元素不相同。</li>
</ul>
<h6 id="应用场景">应用场景</h6>
<ul>
<li>1、原生类型如:int/char/boolean等使用 <strong>==</strong> 进行比较，自定义的对象使用 <strong>equals()</strong></li>
<li>2、<strong>==</strong> 返回true如果两个引用指向相同的对象，<strong>equals()</strong> 的返回结果依赖于具体业务实现</li>
<li>3、字符串的对比使用 <strong>equals()</strong> 代替 <strong>==</strong> 操作符</li>
</ul>
<h5 id="clone">clone</h5>
<ul>
<li><a href="http://blog.csdn.net/zhangjg_blog/article/details/18369201">参考博文：详解Java中的clone方法 -- 原型模式</a></li>
<li><a href="http://blog.csdn.net/rebirth_love/article/details/51792014">参考博文：java之clone方法的使用</a></li>
<li>浅拷贝 和 深拷贝 的区别此处不再赘述。其实是 引用复制 和 内存复制的区别</li>
<li>用法：实现对应的Cloneable接口，重写对应 clone() 方法，并调用父类 super.clone()</li>
<li><strong>注意</strong>：完全意义上的深拷贝几乎是不存在的如果在拷贝一个对象时，要想让这个拷贝的对象和源对象完全彼此独立，那么在引用链上的每一级对象都要被显式的拷贝。所以创建彻底的深拷贝是非常麻烦的，尤其是在引用关系非常复杂的情况下， 或者在引用链的某一级上引用了一个第三方的对象，而这个对象没有实现clone方法， 那么在它之后的所有引用的对象都是被共享的。</li>
</ul>
<h5 id="tostring">toString</h5>
<ul>
<li>若自定义的对象未重写 <strong>toString()</strong> 方法，则会调用父类 <strong>Object</strong> 对应的 <strong>toString()</strong> 输出对应的 <strong>对象的地址</strong>.</li>
</ul>
<pre><code class="language-java">public String toString() {
   return getClass().getName() + &quot;@&quot; + Integer.toHexString(hashCode());
}
</code></pre>
<ul>
<li>调用 print相关函数时，会默认调用 toString()</li>
</ul>
<pre><code class="language-java">public void println(Object x) {
    String s = String.valueOf(x);
    synchronized (this) {
        print(s);
        newLine();
    }
}
public static String valueOf(Object obj) {
    return (obj == null) ? &quot;null&quot; : obj.toString();
}
</code></pre>
<h4 id="java程序从编写到运行的全过程">Java程序从编写到运行的全过程：</h4>
<h5 id="简单描述">简单描述</h5>
<ul>
<li>1、编写代码</li>
<li>2、编译，Java 文件 编译为 class 文件</li>
<li>3、类加载 ClassLoader为执行程序寻找和装载所需要的类。</li>
<li>4、字节码校验。对class文件的代码进行校验，保证代码的安全性。</li>
<li>5、解释（Interpreter）。解释器解释class文件转为机器码。</li>
<li>6、运行：由运行环境中的Runtime对代码进行运行</li>
<li><a href="http://blog.csdn.net/cjj3930337/article/details/6905873">参考博文：简述Java 从代码到运行的全过程</a></li>
<li><a href="http://blog.csdn.net/fuzhongmin05/article/details/54880257">参考博文：Java代码编译过程简述</a></li>
</ul>
<h5 id="之后会结合java内存结构进行具体阐释-敬请期待">之后会结合Java内存结构进行具体阐释。敬请期待</h5>

                </div>
                <div class="clear"></div>
              </section>
            </article>
            <div class="clear"></div>

            <section class="related section">
              
              <article class="prev grid-50 tablet-grid-50 grid-parent">
                <div class="thumb cover lazy loaded" style="background-image: url('https://blog.shunzi.tech/media/images/spring.jpg');"></div>
                 <a href="https://blog.shunzi.tech/post/Head-Frist-Spring-Cloud/" class="full-link"></a>
                 <div class="info">
                  <time datetime="2018-02-06">2018-02-06</time>
                  <h4 class="title white no-margin">Head Frist Spring Cloud</h4>
                </div>
                 <span class="epcl-button red">
                  <img src="https://blog.shunzi.tech/media/images/left-arrow.svg" width="15" alt="Left Arrow">
                </span>
                <div class="overlay"></div>
              </article>
              
              
              <article class="next grid-50 tablet-grid-50 grid-parent">
                <div class="thumb cover lazy loaded" style="background-image: url('https://blog.shunzi.tech/media/images/shu-ju-ku.jpg');"></div>
                 <a href="https://blog.shunzi.tech/post/transaction-and-lock/" class="full-link"></a>
                 <div class="info">
                  <time datetime="2017-12-21">2017-12-21</time>
                  <h4 class="title white no-margin">事务和锁</h4>
                </div>
                 <span class="epcl-button red">
                  <img src="https://blog.shunzi.tech/media/images/right-arrow.svg" width="15" alt="Left Arrow">
                </span>
                <div class="overlay"></div>
              </article>
              

                <div class="clear"></div>
            </section>

              <div class="clear"></div>
              
            
              <div id="comments" class="bg-white hosted ">
                <div class="clear"></div>
<script>
jQuery(document).ready(function($){
    $('.vemoji-btn').text('😀');
    $("#comments").on('click', 'span.vat',function(){
        $(this).parent('div.vmeta').next("div.vcontent").after($("div.vwrap"));
        $('textarea#veditor').focus();
    })
    if(window.location.hash){
        var checkExist = setInterval(function() {
            if ($(window.location.hash).length) {
                $('html, body').animate({scrollTop: $(window.location.hash).offset().top-200}, 600);
                clearInterval(checkExist);
            }
        }, 100);
    }
})
</script>

              </div>
            

            </div>
          </div>
      </main>

          <footer id="footer" class="grid-container">
        <div class="widgets row gradient-effect">
            <div class="default-sidebar border-effect">
              <div class="grid-33 tablet-grid-50 mobile-grid-100">
                <section id="tag_cloud-2" class="widget widget_epcl_posts_thumbs underline-effect">
                  <h4 class="widget-title title white bordered">最新文章</h4>
                  
                  
                  <article class="item post-0 post type-post status-publish format-standard has-post-thumbnail hentry">
                    <a href="https://blog.shunzi.tech/post/cpp-multi-thread/" class="thumb hover-effect">
                      <span class="fullimage cover" style="display:block;border-radius:50%;background-image: url('https://raw.githubusercontent.com/zjs1224522500/PicGoImages/master//img/blog/20210513192958.png');"></span>
                    </a>
                    <div class="info gradient-effect">
                      <time datetime="2021-05-06">2021-05-06</time>
                      <h4 class="title usmall">
                        <a href="https://blog.shunzi.tech/post/cpp-multi-thread/">C++ 多线程</a>
                      </h4>
                    </div>
                    <div class="clear"></div>
                  </article>
                  
                  
                  
                  <article class="item post-1 post type-post status-publish format-standard has-post-thumbnail hentry">
                    <a href="https://blog.shunzi.tech/post/c-basic/" class="thumb hover-effect">
                      <span class="fullimage cover" style="display:block;border-radius:50%;background-image: url('https://raw.githubusercontent.com/zjs1224522500/PicGoImages/master//img/blog/20210513192631.png');"></span>
                    </a>
                    <div class="info gradient-effect">
                      <time datetime="2021-04-06">2021-04-06</time>
                      <h4 class="title usmall">
                        <a href="https://blog.shunzi.tech/post/c-basic/">C 基础</a>
                      </h4>
                    </div>
                    <div class="clear"></div>
                  </article>
                  
                  
                  
                  <article class="item post-2 post type-post status-publish format-standard has-post-thumbnail hentry">
                    <a href="https://blog.shunzi.tech/post/basic-of-concurrency-one/" class="thumb hover-effect">
                      <span class="fullimage cover" style="display:block;border-radius:50%;background-image: url('https://raw.githubusercontent.com/zjs1224522500/PicGoImages/master//img/blog/20200717213648.png');"></span>
                    </a>
                    <div class="info gradient-effect">
                      <time datetime="2021-04-05">2021-04-05</time>
                      <h4 class="title usmall">
                        <a href="https://blog.shunzi.tech/post/basic-of-concurrency-one/">Series Three of Basic of Concurrency - Condition Variables</a>
                      </h4>
                    </div>
                    <div class="clear"></div>
                  </article>
                  
                  
                  
                  
                  
                  
                  
                  
                  
                  
                  
                  
                  
                  
                  
                  
                  
                  
                  
                  
                  
                  
                  
                  
                  
                  
                  
                  
                  
                  
                  
                  
                  
                  
                  
                  
                  
                  
                  
                  
                  
                  
                  
                  
                  
                  
                  
                  
                  
                  
                  
                  
                  
                  
                  
                  
                  
                  
                  
                  
                  
                  
                  
                  
                  
                  
                  
                  
                  
                  
                  
                  
                  
                  
                  
                  
                  
                  
                  
                  
                  
                  
                  
                  
                  
                  
                  
                  
                  
                  
                  
                  
                  
                  
                  
                  
                  
                  
                  
                  
                  
                  
                  
                  
                  
                  
                  
                  
                  
                  
                  
                  
                  
                  
                  
                  
                  
                  
                  
                  
                  
                  
                  
                  
                  
                  
                  
                  
                  
                  
                  
                  
                  
                  
                  
                  
                  
                  
                  
                  
                  
                  
                  
                  
                  
                  
                  
                  
                  
                  
                  
                  
                  
                  
                  
                  
                  
                  
                  
                  
                  
                  
                  
                  
                  
                  
                  
                  
                  
                  
                  
                  
                  
                  
                  
                  
                  
                  
                  
                  
                  
                  
                  
                  
                  
                  
                  
                  
                  
                  
                  
                  
                  
                  
                  
                  
                  
                  
                  
                  
                  
                  
                  
                  
                  
                  
                  
                  
                  
                  
                  
                  
                  
                  
                  
                  
                  
                  
                  
                  
                  
                  
                  
                  
                  
                  
                  <div class="clear"></div>
                </section>
              </div>

              <div class="grid-33 tablet-grid-50 mobile-grid-100">
                <section id="tag_cloud-2" class="widget widget_tag_cloud underline-effect">
                  <h4 class="widget-title title white bordered">标签云</h4>
                  <div class="tagcloud">
                    
                      <a href="https://blog.shunzi.tech/tag/n2w6bz87h/" class="ctag ctag-0 ctag-n2w6bz87h" aria-label="">编程语言</a>
                    
                      <a href="https://blog.shunzi.tech/tag/3zCwFWPHxH/" class="ctag ctag-1 ctag-3zCwFWPHxH" aria-label="">存储</a>
                    
                      <a href="https://blog.shunzi.tech/tag/la-n8a0mo/" class="ctag ctag-2 ctag-la-n8a0mo" aria-label="">读书笔记</a>
                    
                      <a href="https://blog.shunzi.tech/tag/os/" class="ctag ctag-3 ctag-os" aria-label="">OS</a>
                    
                      <a href="https://blog.shunzi.tech/tag/5uQUdLlSC/" class="ctag ctag-4 ctag-5uQUdLlSC" aria-label="">Paper</a>
                    
                      <a href="https://blog.shunzi.tech/tag/_jfuTNqah/" class="ctag ctag-5 ctag-_jfuTNqah" aria-label="">LSM</a>
                    
                      <a href="https://blog.shunzi.tech/tag/hbaTDSglx-/" class="ctag ctag-6 ctag-hbaTDSglx-" aria-label="">工具</a>
                    
                      <a href="https://blog.shunzi.tech/tag/EO3XpMf_y/" class="ctag ctag-7 ctag-EO3XpMf_y" aria-label="">Linux</a>
                    
                      <a href="https://blog.shunzi.tech/tag/wAFV_pvXZ/" class="ctag ctag-8 ctag-wAFV_pvXZ" aria-label="">cs-course</a>
                    
                      <a href="https://blog.shunzi.tech/tag/VqiGqmxbod/" class="ctag ctag-9 ctag-VqiGqmxbod" aria-label="">6.824</a>
                    
                      <a href="https://blog.shunzi.tech/tag/geK0jEW-T/" class="ctag ctag-10 ctag-geK0jEW-T" aria-label="">分布式</a>
                    
                      <a href="https://blog.shunzi.tech/tag/l8sKsLUAi/" class="ctag ctag-11 ctag-l8sKsLUAi" aria-label="">KVS</a>
                    
                      <a href="https://blog.shunzi.tech/tag/9msH-lUaA/" class="ctag ctag-12 ctag-9msH-lUaA" aria-label="">缓存</a>
                    
                      <a href="https://blog.shunzi.tech/tag/i2b42Y2j6/" class="ctag ctag-13 ctag-i2b42Y2j6" aria-label="">Ceph</a>
                    
                      <a href="https://blog.shunzi.tech/tag/oBVOD8v4ou/" class="ctag ctag-14 ctag-oBVOD8v4ou" aria-label="">一致性</a>
                    
                      <a href="https://blog.shunzi.tech/tag/gqgftpk_y/" class="ctag ctag-15 ctag-gqgftpk_y" aria-label="">AI</a>
                    
                      <a href="https://blog.shunzi.tech/tag/shu-ju-ku/" class="ctag ctag-16 ctag-shu-ju-ku" aria-label="">数据库</a>
                    
                      <a href="https://blog.shunzi.tech/tag/ZnIN9Ge-w/" class="ctag ctag-17 ctag-ZnIN9Ge-w" aria-label="">对象存储</a>
                    
                      <a href="https://blog.shunzi.tech/tag/4zx4ysLGro/" class="ctag ctag-18 ctag-4zx4ysLGro" aria-label="">云计算</a>
                    
                      <a href="https://blog.shunzi.tech/tag/Y_nsOD1At/" class="ctag ctag-19 ctag-Y_nsOD1At" aria-label="">SSD</a>
                    
                      <a href="https://blog.shunzi.tech/tag/E2d1yYZcV8/" class="ctag ctag-20 ctag-E2d1yYZcV8" aria-label="">虚拟化</a>
                    
                      <a href="https://blog.shunzi.tech/tag/PhD/" class="ctag ctag-21 ctag-PhD" aria-label="">Ph.D</a>
                    
                      <a href="https://blog.shunzi.tech/tag/ZqEqvRTvl/" class="ctag ctag-22 ctag-ZqEqvRTvl" aria-label="">网络</a>
                    
                      <a href="https://blog.shunzi.tech/tag/PuY19cs53/" class="ctag ctag-23 ctag-PuY19cs53" aria-label="">仿真</a>
                    
                      <a href="https://blog.shunzi.tech/tag/rIIc9E-ZvN/" class="ctag ctag-24 ctag-rIIc9E-ZvN" aria-label="">系统结构</a>
                    
                      <a href="https://blog.shunzi.tech/tag/fu-wu-qi/" class="ctag ctag-25 ctag-fu-wu-qi" aria-label="">服务器</a>
                    
                      <a href="https://blog.shunzi.tech/tag/X-lnqf1Ex/" class="ctag ctag-26 ctag-X-lnqf1Ex" aria-label="">容器</a>
                    
                      <a href="https://blog.shunzi.tech/tag/5h7k39FKw/" class="ctag ctag-27 ctag-5h7k39FKw" aria-label="">C语言</a>
                    
                      <a href="https://blog.shunzi.tech/tag/diary/" class="ctag ctag-28 ctag-diary" aria-label="">Diary</a>
                    
                      <a href="https://blog.shunzi.tech/tag/DyzFtOe6x/" class="ctag ctag-29 ctag-DyzFtOe6x" aria-label="">计算机基础</a>
                    
                      <a href="https://blog.shunzi.tech/tag/oqE3oKihb/" class="ctag ctag-30 ctag-oqE3oKihb" aria-label="">OpenStack</a>
                    
                      <a href="https://blog.shunzi.tech/tag/p_z7gKe6R/" class="ctag ctag-31 ctag-p_z7gKe6R" aria-label="">中间件</a>
                    
                      <a href="https://blog.shunzi.tech/tag/Test/" class="ctag ctag-32 ctag-Test" aria-label="">测试</a>
                    
                      <a href="https://blog.shunzi.tech/tag/Product-Standard/" class="ctag ctag-33 ctag-Product-Standard" aria-label="">Product Standard</a>
                    
                      <a href="https://blog.shunzi.tech/tag/spring/" class="ctag ctag-34 ctag-spring" aria-label="">Spring</a>
                    
                      <a href="https://blog.shunzi.tech/tag/she-ji-mo-shi/" class="ctag ctag-35 ctag-she-ji-mo-shi" aria-label="">设计模式</a>
                    
                      <a href="https://blog.shunzi.tech/tag/mian-jing/" class="ctag ctag-36 ctag-mian-jing" aria-label="">面经</a>
                    
                      <a href="https://blog.shunzi.tech/tag/suan-fa/" class="ctag ctag-37 ctag-suan-fa" aria-label="">算法</a>
                    
                      <a href="https://blog.shunzi.tech/tag/redis/" class="ctag ctag-38 ctag-redis" aria-label="">Redis</a>
                    
                      <a href="https://blog.shunzi.tech/tag/javaweb/" class="ctag ctag-39 ctag-javaweb" aria-label="">JavaWeb</a>
                    
                      <a href="https://blog.shunzi.tech/tag/KyMCZj2Wl/" class="ctag ctag-40 ctag-KyMCZj2Wl" aria-label="">WEB容器</a>
                    
                      <a href="https://blog.shunzi.tech/tag/javase/" class="ctag ctag-41 ctag-javase" aria-label="">JavaSE</a>
                    
                  </div>
                  <div class="clear"></div>
                </section>
              </div>

              <div class="grid-33 tablet-grid-50 mobile-grid-100">
                <section id="epcl_about-2" class="widget widget_epcl_about underline-effect">
                  <h4 class="widget-title title white bordered">关于我</h4>
                  <div class="avatar">
                    <a href="" class="translate-effect thumb"><span class="fullimage cover" style="background-image: url(https://blog.shunzi.tech/images/avatar.png);"></span></a>
                  </div>
                  <div class="info">
                    <h4 class="title small author-name gradient-effect no-margin"><a href="">Elvis Zhang</a></h4>
                    <p class="founder">The easy way or the right way.</p>
                    <div class="social">
                      
                          
                            <a href="https://github.com/zjs1224522500" class="translate-effect" target="_blank"><i class="fa fa-github"></i></a>
                        
                      
                          
                            <a href="https://twitter.com/1224522500Elvis" class="translate-effect" target="_blank"><i class="fa fa-twitter"></i></a>
                        
                      
                        
                      
                        
                      
                        
                      
                    </div> 
                  </div>
                  <div class="clear"></div>
                  </section>
              </div>

            </div>
            <div class="clear"></div>
        </div>

        <div class="logo">
          <a href="https://blog.shunzi.tech"><img src="\media\images\custom-footerLogo.jpg" alt=""></a>
        </div>
        <p class="published border-effect">
          ©2019 共 115 篇文章
          <br/>
          Theme <a href="https://gridea.dev/" target="_blank">「breek」</a> Powered by <a href="https://gridea.dev/" target="_blank">「Gridea」</a>
        </p>
        
        <a href="javascript:void(0)" id="back-to-top" class="epcl-button dark" style="display:none">
          <i class="fa fa-arrow"></i>
        </a>
    </footer>
    
    <div class="clear"></div>

        
<script type="text/javascript" src="https://cdn.jsdelivr.net/npm/leancloud-storage/dist/av-min.js"></script>
<script type="text/javascript" src="https://cdn.staticfile.org/valine/1.3.10/Valine.Pure.min.js"></script>
<script>
    new Valine({
        el: '#comments',
        appId: 'Pj5H1z0w7hJlLGJpGBh9NrCq-MdYXbMMI' ,
        appKey: 'LdR8vK5EaBfK87esF7tlbsXe',
        pageSize: 30,
        placeholder: '既然来了，那就留个痕迹吧~',
        visitor: true // 阅读量统计
    })
</script>
    

      
    <script src="https://blog.shunzi.tech/media/js/functions-post.js"></script>

    </div>
    <!-- end: #wrapper -->
  </body>
</html>
